package collections;

import org.junit.jupiter.api.Test;

import java.util.*;

/**
 * @Author Zhang Chao
 * @Date 2021/5/23 11:02
 * @Version 1.0
 */
public class TestDriver {

      /*
     *
     * 已知数据：

stuNum  stuName  stuAge  stuAddress
1	     张三      20       陕西西安
2        李四      19       山西太原
3        王五      20       河北石家庄


使用集合将二维表格的内容进行存储，并进行遍历显示；
分析：需要进行二维存储，需要行和列的存储
      列用 map 【key-value键值对】存储一行数据中的所有的列的值   类名-值  构成键值对
      行可以使用 list 或者 set集合存储，此处建议使用 lsit存储；
      结果：使用map存储一行数据；使用list存储所有map，lsit中有一个map就表示有一行数据；

     */


    @Test
    public void test01(){
        //初始化数据
        List<Map<String,Object>> Table = initData();

        //打印遍历数据
        printTable(Table);
    }


    /**
     * 打印数据
     * @param list 被打印的结果集
     */
    private void printTable(List<Map<String,Object>> list){
        // 打印表格的表头
        boolean canPrint = true;

        // 遍历外层list，取出各行的数据对象
        for (Map<String, Object> eachRowMap : list) {
            // 遍历当前行的map
            // map 的遍历一般是转换为对 entryset集合或者是 keyset集合的遍历，这样就成为了set的遍历方式
            //eachRowMap.keySet();
            Set<Map.Entry<String, Object>> entrySet = eachRowMap.entrySet();
            // 获取 entryset的 迭代器  Iterator 注意：实现了 Iteratable 接口才具有迭代器的遍历能力
            Iterator<Map.Entry<String, Object>> it = entrySet.iterator();
            // 使用迭代器遍历set集合
            // 打印表头，只打印一次
            if (canPrint) {
                while (it.hasNext()) {
                    // 取出当前遍历的对象
                    Map.Entry<String, Object> en = it.next();
                    System.out.print("      " + en.getKey());
                }
                // 换行
                System.out.println();
                // 设置打印标志位为false，下一次循环不再打印
                canPrint = false;
            }

            // 重新获取迭代器，再次进行遍历
            it = entrySet.iterator();
            while (it.hasNext()) {
                // 取出当前遍历的对象
                Map.Entry<String, Object> en = it.next();
                System.out.print("         " + en.getValue());
            }
            // 换行
            System.out.println();
        }
    }

    /**
     * 初始化数据
     * @return list结果集
     */
    private List<Map<String,Object>> initData(){
        // 声明存储二维表各行数据的List
        List<Map<String, Object>> list = new ArrayList<>();
        //初始化各行数据

        // 每行数据存储在一个map中，map存入的是键值对  列名 - value 构成
        Map<String, Object> row0 = new LinkedHashMap<>();
        // 存入当前行的各列的数据
        row0.put("stuNum", 1);
        row0.put("stuName", "张三");
        row0.put("stuAge", 20);
        row0.put("stuAddress", "陕西西安");

        // 把当前行数据，存入list中，list中一个map就表示一行数据
        list.add(row0);

        // 每行数据存储在一个map中，map存入的是键值对  列名 - value 构成
        Map<String, Object> row1 = new LinkedHashMap<>();
        // 存入当前行的各列的数据
        row1.put("stuNum", 2);
        row1.put("stuName", "李四");
        row1.put("stuAge", 19);
        row1.put("stuAddress", "山西太原");
        // 把当前行数据，存入list中，list中一个map就表示一行数据
        list.add(row1);

        // 每行数据存储在一个map中，map存入的是键值对  列名 - value 构成
        Map<String, Object> row2 = new LinkedHashMap<>();
        // 存入当前行的各列的数据
        row2.put("stuNum", 3);
        row2.put("stuName", "王五");
        row2.put("stuAge", 20);
        row2.put("stuAddress", "河北石家庄");
        // 把当前行数据，存入list中，list中一个map就表示一行数据
        list.add(row2);


        return list;
    }
}
